package xml;

import java.rmi.RemoteException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import remoto.Proxy;
import dominio.Cliente;
import dominio.ItemSolicitud;
import dominio.SolicitudRodamientos;
import dominioTO.ClienteTO;


public class SolicitudRodamientoClienteXML {
	private String ARCHIVO; 
	private static SolicitudRodamientoClienteXML instancia;
	private Document doc;
	
	public static SolicitudRodamientoClienteXML getInstancia(String nombreArchivo){
		if(instancia == null){
			instancia = new SolicitudRodamientoClienteXML();			
		}
		instancia.ARCHIVO = "http://localhost:8080/ServidorNegocio/xml/"+nombreArchivo;
		instancia.crearDocumento();
		return instancia;
	}
	
	private void crearDocumento(){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			doc = builder.parse(ARCHIVO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
		
	public SolicitudRodamientos validarCotizacion() throws RemoteException{
		SolicitudRodamientos solicitudCliente= new SolicitudRodamientos();
		
		NodeList listaNodos = doc.getElementsByTagName("SolicitudCotizacion");
		Node nodo_Cotizacion = listaNodos.item(0);
		Element elementCotizacion = (Element) nodo_Cotizacion;
		
		//Obtengo el atributo del Numero de pedido de cliente
		solicitudCliente.setOrdenCompraCliente(elementCotizacion.getAttribute("numero"));
		
		//Fecha de emision de Cotizacion
		solicitudCliente.setFechaSolicitud(Date.valueOf(elementCotizacion.getAttribute("fecha")));
		
		
		//Busco al cliente
		Element elementCliente = (Element)elementCotizacion.getElementsByTagName("Cliente").item(0);
		solicitudCliente.setCliente(this.mapCliente(elementCliente));
			
		//Busco nodo rodamiento --> Contiene Items
		NodeList nodeListRodamiento  = elementCotizacion.getElementsByTagName("Item");
		
		List<ItemSolicitud> itemSolicitud= new ArrayList<ItemSolicitud>();
		
		if (nodeListRodamiento != null){
			for (int j = 0; j < nodeListRodamiento.getLength(); j ++) 
			{
				Node nodeRodamientos = nodeListRodamiento.item(j);
				if (nodeRodamientos.getNodeType() == Node.ELEMENT_NODE) {
					Element elementRodamiento = (Element) nodeRodamientos;
					itemSolicitud.add(mapItemSolicitudRodamiento(elementRodamiento));
				}
			}
		}
		solicitudCliente.setItemSolicitudes(itemSolicitud);
		
		System.out.println(solicitudCliente.toString());
		return solicitudCliente;

	}
	
	
	private Cliente  mapCliente(Element elementCliente) {
		try {
			String cuil = elementCliente.getElementsByTagName("Cuil").item(0).getTextContent();
			ClienteTO cliTO = Proxy.getInstancia().buscarCliente(cuil);
			Cliente cli = new Cliente();
			cli.setCuit(cliTO.getCuit());
			cli.setRazonSocial(cliTO.getRazonSocial());
			cli.setFechaAlta(cliTO.getFechaAlta());
			cli.setDescuentos(cliTO.getDescuentos());
			cli.setRespInscripto(cliTO.isRespInscripto());
			cli.setIngBrutos(cliTO.getIngBrutos());
			cli.setCondPago(cliTO.getCondPago());
			cli.setEstado(cliTO.isEstado());
			
			return cli;
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	
	}

	private ItemSolicitud  mapItemSolicitudRodamiento(Element elementItem) throws RemoteException {
		ItemSolicitud item = new ItemSolicitud();		
		item.setCantidad(Integer.valueOf(elementItem.getElementsByTagName("Cantidad").item(0).getTextContent()));
		item.setnSerie(elementItem.getAttribute("serie"));
		item.setMarca( elementItem.getElementsByTagName("Marca").item(0).getTextContent());
		item.setOrigen(elementItem.getElementsByTagName("Origen").item(0).getTextContent());
		item.setSufijo(elementItem.getElementsByTagName("Sufijo").item(0).getTextContent());
		
		return item;
	}
	
	private static String getTagValue(String sTag, Element eElement)
	{
		NodeList nlList= eElement.getElementsByTagName(sTag).item(0).getChildNodes();
		Node nValue = (Node) nlList.item(0);
		return nValue.getNodeValue();
	}
}
